package com.csdj.crm.service;

import com.csdj.crm.base.BaseService;
import com.csdj.crm.dao.SaleChanceMapper;
import com.csdj.crm.enums.DevResult;
import com.csdj.crm.enums.StateStatus;
import com.csdj.crm.query.SaleChanceQuery;
import com.csdj.crm.utils.AssertUtil;
import com.csdj.crm.utils.PhoneUtil;
import com.csdj.crm.vo.SaleChance;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * 营销机会模块
 */
@Service
public class SaleChanceService extends BaseService<SaleChance,Integer> {

    @Autowired(required = false)
    private SaleChanceMapper saleChanceMapper;

    /**
     * 多条件分页查询 营销机会
     * 返回的数据格式 必须满足layui中数据表格要求的格式
     * @param saleChanceQuery
     * @return
     */
    public Map<String,Object> querySaleChanceByParams(SaleChanceQuery saleChanceQuery){
        Map<String,Object> map=new HashMap<>();
        //开启分页
        PageHelper.startPage(saleChanceQuery.getPage(),saleChanceQuery.getLimit());
        //得到对应的分页对象
        PageInfo<SaleChance> pageInfo=new PageInfo<>(saleChanceMapper.selectByParams(saleChanceQuery));

        //设置map对象
        map.put("code",0);
        map.put("msg","success");
        map.put("count",pageInfo.getTotal());
        //设置分页好的列表
        map.put("data",pageInfo.getList());
        return map;
    }

    /**
     * 添加营销机会
     * 1. 参数校验
     *     customerName 客户名称 非空
     *     linkMan联系人  非空
     *     linkPhone 联系号码 非空，手机号码格式正确
     *
     * 2. 设置相关参数的默认值
     *      createMan创建人  当前登录用户
     *      assignMan指派人
     *        如果未设置指派人（默认)
     *             state 分配状态 (0=未分配,1=已分配)
     *                0= 未分配
     *                assignTime指派时间
     *                   设置为null
     *                   devResult 开发状态 (0=未开发 1=开发中 2=开发成功 3=开发失败)
     *                      0=未开发
     *        如果设置了指派人
     *             state分配状态 (0=未分配 1=已分配)
     *             1=已分配
     *         assignTime指派时间  系统当前时间
     *             devResult 开发状态 (0=未开发 1=已开中 2=开发成功 3=开发失败)
     *                1=开发中
     *         isValid 是否有效  (0=无效 1=有效)
     *           设置为有效 1=有效
     *           createDate 创建时间
     *              默认是系统当前时间
     *           updateDate
     *               默认是系统当前时间
     *
     *    3.执行添加操作 判断受影响的行数
     *
     *  * @param saleChance
     */
    @Transactional(propagation = Propagation.REQUIRED)
    public void addSaleChance(SaleChance saleChance){

        /*1.校验参数 */
        checkSaleChanceParams(saleChance.getCustomerName(),saleChance.getLinkMan(),saleChance.getLinkPhone());
        /*2.设置相关属性的默认值 */
        //IsValid是否有效 （0=无效 1=有效） 设置为有效 1=有效
        saleChance.setIsValid(1);
        saleChance.setCreateDate(new Date());
        //updateDate 默认是当前系统时间
        saleChance.setUpdateDate(new Date());
        //设置了是否是指派人
        if(!StringUtils.isNotBlank(saleChance.getAssignMan())){
            //如果为空 表示没有设置指派人
            //state 分配状态 (0=未分配 1=已分配) 0=未分配
            saleChance.setState(StateStatus.UNSTATE.getType());
            //assignTime指派时间设置为 null
            saleChance.setAssignTime(null);
            //devResult开发状态 (0=未开发 1=开发中 2=开发成功 3=开发失败) 0=未开发
            saleChance.setDevResult(DevResult.UNDEV.getStatus());

        }else {
            //如果不为空，则表示设置了指派人
            //state 分配状态 (0=未分配 1=已分配) 1=已分配
            saleChance.setState(StateStatus.STATED.getType());
            //assignTime指派时间设置为 new Date()
            saleChance.setAssignTime(new Date());
            //devResult开发状态 (0=未开发 1=开发中 2=开发成功 3=开发失败) 1=开发中
            saleChance.setDevResult(DevResult.DEVING.getStatus());
        }
        //3.执行添加操作 判断受影响的行数
        AssertUtil.isTrue(saleChanceMapper.insertSelective(saleChance)!=1,"添加营销机会失败！");


    }

    /**
     * 参数校验
     * @param customerName
     * @param linkMan
     * @param linkPhone
     */
    private void checkSaleChanceParams(String customerName, String linkMan, String linkPhone) {

        AssertUtil.isTrue(StringUtils.isBlank(customerName),"客户名称不能为空!");
        AssertUtil.isTrue(StringUtils.isBlank(linkMan),"联系人不能为空!");
        AssertUtil.isTrue(StringUtils.isBlank(linkPhone),"联系号码不能为空!");
        AssertUtil.isTrue(!PhoneUtil.isMobile(linkPhone),"联系号码格式不正确!");

    }


    /**
     * 更新营销机会数据
     *   1.参数校验
     *        营销机会Id 非空 数据库中的记录存在
     *          customerName 客户名称 非空
     *          linkMan联系人  非空
     *          linkPhone 联系号码 非空，手机号码格式正确
     *  2.设置相关参数的默认值
     *        updateDate更新时间 设置为当前系统时间
     *        assignMan 指派人 有4种情况
     *        1)原来没有设置 现在设置了
     *        2)原来没有设置 我现在也没有设置
     *        3)原来设置了 我现在没有设置
     *        4)原来设置了 我现在也设置了
     *          原始数据未设置
     *                  修改后未设置 (不需要操作)
     *                  修改后已设置
     *                  (设置指派时间 assginTime指派时间 设置未系统当前时间)
     *                  (分配状态 改为已分配=1)
     *                  (开发状态 改为开发中=1)
     *          原始数据已设置
     *           修改后未设置
     *            (设置指派时间 assginTime指派时间 设置为null)
     *            (分配状态 改为未分配=0)
     *            (开发状态 改为未开发=0)
     *           修改后已设置
     *                判断修改前后是否是同一个指派人
     *                 如果是 则不需要操作
     *                 如果不是 则需要更新指派时间
     *
     *      3.执行更新操作，判断受影响的行数
     *
     * @param saleChance
     */
    @Transactional(propagation = Propagation.REQUIRED)
    public void updateSaleChance(SaleChance saleChance){
        /* 1.参数校验 */
        //营销机会ID 非空，数据库中对应的记录存在
        AssertUtil.isTrue(null==saleChance.getId(),"待更新记录不存在");
        //通过主键查询 对象
        SaleChance temp=saleChanceMapper.selectByPrimaryKey(saleChance.getId());
        //判断数据库中的记录是否存在
        AssertUtil.isTrue(temp==null,"待更新记录不存在！");
        //参数校验
        checkSaleChanceParams(saleChance.getCustomerName(),saleChance.getLinkMan(),saleChance.getLinkPhone());
        /*2.设置相关参数默认值*/
        //updateDate 更新时间 设置为系统当前时间
        saleChance.setUpdateDate(new Date());
        //assignMan 指派人
        //判断原始数据是否存在
        if(StringUtils.isBlank(temp.getAssignMan())){ //不存在
            //判断修改后的值是否存在
            if(!StringUtils.isBlank(saleChance.getAssignMan())){//修改前为空 修改后有值
               // (设置指派时间 assginTime指派时间 设置未系统当前时间)
              //  (分配状态 改为已分配=1)
              //  (开发状态 改为开发中=1)
                saleChance.setAssignTime(new Date());
                saleChance.setState(StateStatus.STATED.getType());
                saleChance.setDevResult(DevResult.DEVING.getStatus());
            }
        }else {
            //存在
            //判断修改后的值是否存在
            if(StringUtils.isBlank(saleChance.getAssignMan())){
                //修改前有值 修改后无值
                //(设置指派时间 assginTime指派时间 设置为null)
               // (分配状态 改为未分配=0)
               // (开发状态 改为未开发=0)
                saleChance.setAssignTime(null);
                saleChance.setState(StateStatus.UNSTATE.getType());
                saleChance.setDevResult(DevResult.UNDEV.getStatus());
            } else {
                //修改前有值 修改后有值
                //判断修该前后是否是同一个用户
                if(!saleChance.getAssignMan().equals(temp.getAssignMan())){
                    //更新指派时间
                    saleChance.setAssignTime(new Date());
                }else{
                    saleChance.setAssignTime(temp.getAssignTime());
                }
            }

        }

        /*3.执行更新操作，判断受影响的行数*/
        AssertUtil.isTrue(saleChanceMapper.updateByPrimaryKeySelective(saleChance)!=1,"更新营销机会失败!");

    }


    /**
     * 营销机会数据删除
     * @param ids
     */
    @Transactional(propagation = Propagation.REQUIRED)
    public void deleteSaleChance(Integer[] ids){
        //判断要删除的Id是否为空
        AssertUtil.isTrue(null==ids||ids.length==0,"请选择要删除的数据!");
        //删除数据
        AssertUtil.isTrue(saleChanceMapper.deleteBatch(ids)<0,"营销机会数据删除失败！");

    }

    /**
     * 更新营销机会的状态
     *  成功 = 2
     *  失败 = 3
     * @param id
     * @param devResult
     */
    public void updateSaleChanceDevResult(Integer id,Integer devResult){
        AssertUtil.isTrue(null==id,"待更新记录不存在!");
       SaleChance saleChance= selectByPrimaryKey(id);
       AssertUtil.isTrue(saleChance==null,"待更新记录不存在!");
       saleChance.setDevResult(devResult);
       AssertUtil.isTrue(updateByPrimaryKeySelective(saleChance)<1,"营销机会数据更新失败！");

    }




}
